/**
 * 
 */
package ar.com.seminario.systema.dao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import ar.com.seminario.common.persistence.dao.GenericDao;
import ar.com.seminario.common.persistence.exception.DaoException;
import ar.com.seminario.systema.model.OpcionMenu;
import ar.com.seminario.systema.model.Usuario;

/**
 * Clase de acceso a datos para la entidad {@link Usuario}.
 * 
 * @author Pablo Lamas
 * 
 */
public class LogInnDao extends GenericDao<Usuario, Long> {

	/**
	 * Devuelve el usuario en función de su username y password.
	 * 
	 * @param username nombre de usuario de quien intenta loguearse.
	 * @param password contraseña de quien intenta loguearse.
	 * 
	 * @return El usuario.
	 * @throws DaoException En caso de problemas.
	 */
	public Usuario getUsuarioByUsernamePassword(String username, String password)
			throws DaoException {

		if (username == null) {
			throw new IllegalArgumentException("El parametro username es requerido.");
		}

		if (password == null) {
			throw new IllegalArgumentException("El parametro password es requerido.");
		}

		final Criteria criteria = this.getSession().createCriteria(Usuario.class);
		criteria.add(Restrictions.like("usuario", username));
		criteria.add(Restrictions.like("clave", password));

		try {
			return (Usuario) criteria.uniqueResult();
		} catch (final HibernateException e) {
			throw new DaoException(e);
		}
	}

	/**
	 * Obtiene las opciones del menu para un usuario por su Id.
	 * 
	 * @param userId el identificador del usuario.
	 * 	
	 * @return la lista de opciones del usuario.   
	 * 
	 * @throws DaoException En caso de error.
	 */
	public List<OpcionMenu> getOptionsByUserId(Long userId) throws DaoException {
		
		if (userId == null) {
			throw new IllegalArgumentException("El parametro userId es requerido.");
		}

		final Criteria criteria = this.getSession().createCriteria(Usuario.class);
		criteria.add(Restrictions.like("id", userId));
		
		try {
			
			Usuario usuario = (Usuario)criteria.uniqueResult();
			
			List<OpcionMenu> opcionesOrdenadas = new ArrayList<OpcionMenu>(); 
			for (OpcionMenu opcionMenu : usuario.getOpciones()) {
				opcionesOrdenadas.add(opcionMenu);
			}
			
			Collections.sort(opcionesOrdenadas, new Comparator<OpcionMenu>() {
				public int compare(OpcionMenu o1, OpcionMenu o2) {
					return o1.getId() < o2.getId() ? -1 : o1.getId() == o2.getId() ? 0 : 1;
				}
			});

			return opcionesOrdenadas;
			
		} catch (final HibernateException e) {
			throw new DaoException(e);
		}
	}
}
